#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

// 将文件描述符设置为非阻塞形式。
void SetNon(int fd)
{
	int f1 = fcntl(fd,F_GETFL);

	if(f1 < 0)
	{
		perror("getfl fail");

		return ;
	}

	fcntl(fd,F_SETFL,f1 | O_NONBLOCK);
}

int main()
{
	SetNon(0);

	// 系统的输入输出默认都是阻塞的。
	// 但是我们可以让他非阻塞。
	char buffer[1024];

	while(true)
	{
		ssize_t n = read(0,buffer,sizeof(buffer));

		if(n > 0)
		{
			// 最末尾字符的是回车。所以要顶替掉。
			buffer[n - 1] = 0;

			std::cout << buffer << std::endl;
		}
		// 以往我们都是要从n的值为负数就报错返回退出码，退出进程的。
		// 为什么这一次例外呢？因为以往是阻塞IO，如果没输入，就会一直阻塞。
		// 这次是非阻塞IO。
		else if(n < 0)
		{
			// 我们更加担心为什么出错了。
			// 所以我们设置错误码。
			// 1.进程出错了 2.数据没准备好
			if(errno == EAGAIN || errno == EWOULDBLOCK)
			{
				std::cout << "数据没有准备好..." << std::endl;

				sleep(1);

				continue;
			}
			// 数据准备好了，向进程发送中断。
			else if(errno == EINTR)
			{
			//	std::cout << "数据准备好了" << std::endl;
				continue;
			}	
		}
		else 
		{
			break;
		}

		// 没打出来是因为C++也有语言级缓冲区。
		// std::cout << ".";
		
		// std::cout << "." << std::endl;
		//
		// sleep(1);
	}

	return 0;
}
